home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-Sensation: Golden Games / Amiga CD-Sensation - Ausgabe 2 - Golden Games (1996)(GTI - Schatztruhe)(DE)[!].iso / Brain Activity / Rubik / source / rubik.c < prev    next >
C/C++ Source or Header  |  1990-08-11  |  10KB  |  458 lines

  1. /*    rubik.c    */
  2.  
  3. /*    started 23-Dec-89    */
  4.  
  5. /*    Declarations for CBACK    */
  6. extern BPTR _Backstdout;        /*    std output when run in background    */
  7. long _BackGroundIO = 1;            /*    Flag to tell it we want to do I/O    */
  8. long _stack = 4000;                /*    Amount of stack space task needs    */
  9. char *_procname = "Rubik";        /*    The name of the task to create        */
  10. long _priority = 0;                /*    The priority to run us at            */
  11.  
  12. struct points point;    /*    holds posn.s of all points     */
  13. struct points start;
  14. struct one_square square[56];        /*    54 on cube plus 2 inter-planes    */
  15. struct coord *temp;
  16. struct Window *wnd1 = NULL;
  17. struct Window *wnd2 = NULL;
  18. struct Window *window;
  19. struct Screen *scr1 = NULL;
  20. struct Screen *scr2 = NULL;
  21. struct Screen *screen;
  22. struct IntuiMessage *msg = NULL;
  23. extern struct IntuiMessage *solve();
  24. extern struct Gadget fastergadget,slowergadget;
  25. extern struct Gadget normalgadget,solvegadget,setupgadget;
  26.  
  27. /*    size is half the side length of a SMALL cube...1/6 of whole cube    */
  28. unsigned short size;
  29. short mode;
  30. int viewdist;
  31. short xcent,ycent;
  32. short alpha,beta,gamma,delta;
  33. unsigned short scaling;
  34.  
  35. extern int clockwise (int);
  36. extern int whatsquare (int, int);
  37. extern int paints (int, int, int);
  38. extern short waiting_output;
  39.  
  40. extern void init_squares();
  41. extern void init_points();
  42. extern void init_trig();
  43. extern void cleanup();
  44. extern void getwindow();
  45. extern void roll (short);
  46. extern void yaw (short);
  47. extern void pitch (short);
  48. extern void twist (short, short);
  49. extern void draw_square(int);
  50. extern void showcube (short, short, short, short, short, short);
  51. extern void findangles (short *, short *, short *);
  52. extern void addpaints();
  53. extern void removepaints();
  54. extern void selectpen(int);
  55. extern void modcolours(int, int, int);
  56. extern void helpblurb();
  57. extern void aboutblurb();
  58.  
  59. void swap (int i)
  60.     {
  61.     temp = square[i].corner[1];
  62.     square[i].corner[1] = square[i].corner[3];
  63.     square[i].corner[3] = temp;
  64.     }
  65.  
  66. void showit (short *alpha, short *beta, short *gamma)
  67.     {
  68.     ReplyMsg((struct Message *) msg);
  69.     findangles(alpha,beta,gamma);
  70.     showcube (*alpha,*beta,*gamma,0,0,0);
  71.     }
  72.  
  73. void select (short mode)    /*    pseudo mutual exclude    */
  74.     {
  75.     int i;
  76.     
  77.     for (i=0; i<3; i++)
  78.         {
  79.         SetDrMd (wnd1->RPort,JAM1);
  80.         SetDrMd (wnd2->RPort,JAM1);
  81.  
  82.         if (i == mode)
  83.             {
  84.             SetAPen(wnd1->RPort,7);
  85.             SetAPen(wnd2->RPort,7);
  86.             }
  87.         else
  88.             {
  89.             SetAPen(wnd1->RPort,0);
  90.             SetAPen(wnd2->RPort,0);
  91.             }
  92.  
  93.         RectFill (wnd1->RPort,198,114+12*i,252,124+12*i);
  94.         RectFill (wnd2->RPort,198,114+12*i,252,124+12*i);
  95.         SetDrMd (wnd1->RPort,COMPLEMENT);
  96.         SetDrMd (wnd2->RPort,COMPLEMENT);
  97.         switch (i)
  98.             {
  99.             case 0:
  100.                 Move(wnd1->RPort,202,122);
  101.                 Text(wnd1->RPort,"NORMAL",6);
  102.                 Move(wnd2->RPort,202,122);
  103.                 Text(wnd2->RPort,"NORMAL",6);
  104.                 break;
  105.  
  106.             case 1:
  107.                 Move(wnd1->RPort,206,134);
  108.                 Text(wnd1->RPort,"SOLVE",5);
  109.                 Move(wnd2->RPort,206,134);
  110.                 Text(wnd2->RPort,"SOLVE",5);
  111.                 break;
  112.  
  113.             case 2:
  114.                 Move(wnd1->RPort,206,146);
  115.                 Text(wnd1->RPort,"SETUP",5);
  116.                 Move(wnd2->RPort,206,146);
  117.                 Text(wnd2->RPort,"SETUP",5);
  118.                 break;
  119.             }
  120.         }
  121.     SetDrMd (wnd1->RPort,JAM1);
  122.     SetDrMd (wnd2->RPort,JAM1);
  123.  
  124.     }
  125.  
  126. struct IntuiMessage *getmsg()
  127.     {
  128.     if
  129.         (
  130.         (msg = (struct IntuiMessage *) GetMsg(wnd1->UserPort)) ||
  131.         (msg = (struct IntuiMessage *) GetMsg(wnd2->UserPort))
  132.         )
  133.         ;
  134.     return (msg);
  135.     }
  136.     
  137. void showtwist (short i, short j)
  138.     {
  139.     showcube (alpha,beta,gamma,i,j,delta);
  140.     }
  141.  
  142. void _main (char *cmd)
  143.     {
  144.     int i,j;
  145.     int pen;
  146.         
  147.     size = 2048;
  148.     scaling = 7;
  149.     viewdist = (2 << (scaling-3)) * size;
  150.         
  151.     init_trig();
  152.     
  153.     getwindow();
  154.     init_squares();
  155.     init_points();
  156.  
  157.     SetOPen(wnd1->RPort,0);
  158.     SetOPen(wnd2->RPort,0);
  159.  
  160.     window = wnd1;
  161.     screen = scr1;
  162.  
  163.     xcent = 96;
  164.     ycent = 104;
  165.     delta = 15;                    /*    degrees of twist per frame    */
  166.  
  167.     alpha = 0;
  168.     beta = 45;
  169.     gamma = 30;
  170.  
  171.     /*    make those squares that we can initialy see clockwise    */
  172.     point = start;
  173.     
  174.     for (i=0; i<54; i++)
  175.         {
  176.         if (clockwise(i))
  177.             {
  178.             if (i > 8)
  179.                 swap (i);
  180.             }
  181.         else    /*    anticlockwise    */
  182.             {
  183.             if (i < 9)
  184.                 swap (i);
  185.             }
  186.         }
  187.  
  188.     showcube (alpha,beta,gamma,0,0,0);
  189.     select (mode = 0);
  190.     waiting_output = 0;
  191.  
  192.     for (;;)    /*    forever    */
  193.         {
  194.         if (mode == 1)
  195.             {
  196.             msg = solve();
  197.             if (msg == NULL)
  198.                 select (mode = 0);
  199.             }
  200.         else
  201.             msg = getmsg();
  202.         
  203.         if (msg)
  204.             {
  205.             switch (msg->Class)
  206.                 {
  207.                 case CLOSEWINDOW:
  208.                      ReplyMsg((struct Message *) msg);
  209.                      cleanup();
  210.                     Close (_Backstdout);
  211.                      exit(0L);
  212.                      break;
  213.                     
  214.                 case GADGETUP:
  215.                     switch (((struct Gadget *) msg->IAddress)->GadgetID)
  216.                         {
  217.                         case 1:
  218.                             roll (delta);
  219.                             showit (&alpha,&beta,&gamma);
  220.                             break;
  221.  
  222.                         case 2:
  223.                             roll ((short) -delta);
  224.                             showit (&alpha,&beta,&gamma);
  225.                             break;
  226.  
  227.                         case 3:
  228.                             yaw (delta);
  229.                             showit (&alpha,&beta,&gamma);
  230.                             break;
  231.  
  232.                         case 4:
  233.                             yaw ((short) -delta);
  234.                             showit (&alpha,&beta,&gamma);
  235.                             break;
  236.  
  237.                         case 5:
  238.                             pitch (delta);
  239.                             showit (&alpha,&beta,&gamma);
  240.                             break;
  241.  
  242.                         case 6:
  243.                             pitch ((short) -delta);
  244.                             showit (&alpha,&beta,&gamma);
  245.                             break;
  246.  
  247.                         case 7:            /*    front    */
  248.                             alpha = 0;
  249.                             beta = 45;
  250.                             gamma = 30;
  251.                             ReplyMsg((struct Message *) msg);
  252.                             showcube (alpha,beta,gamma,0,0,0);
  253.                             break;
  254.  
  255.                         case 8:            /*    back    */
  256.                             alpha = 0;
  257.                             beta = -135;
  258.                             gamma = -30;
  259.                             ReplyMsg((struct Message *) msg);
  260.                             showcube (alpha,beta,gamma,0,0,0);
  261.                             break;
  262.                         
  263.                         case 9:            /*    faster    */
  264.                             ReplyMsg((struct Message *) msg);
  265.                             if (delta == 5)
  266.                                 delta = 15;
  267.                             else if (delta == 15)
  268.                                 delta = 30;
  269.                             else
  270.                                 {
  271.                                 delta = 45;
  272.                                 OffGadget(&fastergadget,wnd1,NULL);
  273.                                 OffGadget(&fastergadget,wnd2,NULL);
  274.                                 }
  275.                             OnGadget(&slowergadget,wnd1,NULL);
  276.                             OnGadget(&slowergadget,wnd2,NULL);
  277.  
  278.                             break;
  279.  
  280.                         case 10:        /*    slower    */
  281.                             ReplyMsg((struct Message *) msg);
  282.                             if (delta == 45)
  283.                                 delta = 30;
  284.                             else if (delta == 30)
  285.                                 delta = 15;
  286.                             else
  287.                                 {
  288.                                 delta = 5;
  289.                                 OffGadget(&slowergadget,wnd1,NULL);
  290.                                 OffGadget(&slowergadget,wnd2,NULL);
  291.                                 }
  292.                             OnGadget(&fastergadget,wnd1,NULL);
  293.                             OnGadget(&fastergadget,wnd2,NULL);
  294.                             break;
  295.                         
  296.                         case 11:        /*    help    */
  297.                             ReplyMsg((struct Message *) msg);
  298.                             helpblurb();
  299.                             
  300.                             while ((msg = getmsg()) == NULL)
  301.                                 Delay (1);
  302.                                 
  303.                             ReplyMsg((struct Message *) msg);
  304.                             showcube (alpha,beta,gamma,0,0,0);
  305.                             break;
  306.  
  307.                         case 12:        /*    about    */
  308.                             ReplyMsg((struct Message *) msg);
  309.                             aboutblurb();
  310.                             
  311.                             while ((msg = getmsg()) == NULL)
  312.                                 Delay (1);
  313.                                 
  314.                             ReplyMsg((struct Message *) msg);
  315.                             showcube (alpha,beta,gamma,0,0,0);
  316.                             break;
  317.  
  318.                         case 13:        /*    normal    */
  319.                             ReplyMsg((struct Message *) msg);
  320.                             if (mode == 2)
  321.                                 removepaints();
  322.                             select(mode = 0);
  323.                             
  324.                             SetDrMd(wnd1->RPort,JAM1);
  325.                             SetAPen(wnd1->RPort,0);
  326.                             RectFill(wnd1->RPort,190,150,317,197);
  327.     
  328.                             ClipBlit
  329.                                 (
  330.                                 wnd1->RPort,190,150,
  331.                                 wnd2->RPort,190,150,
  332.                                 128,48,
  333.                                 0xc0
  334.                                 );
  335.                                 
  336.                             break;
  337.  
  338.                         case 14:        /*    solve    */
  339.                             ReplyMsg((struct Message *) msg);
  340.                             if (mode == 2)
  341.                                 removepaints();
  342.                             select(mode = 1);
  343.                             break;
  344.  
  345.                         case 15:        /*    setup    */
  346.                             if (mode != 2)
  347.                                 {
  348.                                 SetDrMd(wnd1->RPort,JAM1);
  349.                                 SetAPen(wnd1->RPort,0);
  350.                                 RectFill(wnd1->RPort,190,150,317,197);
  351.     
  352.                                 ClipBlit
  353.                                     (
  354.                                     wnd1->RPort,190,150,
  355.                                     wnd2->RPort,190,150,
  356.                                     128,48,
  357.                                     0xc0
  358.                                     );
  359.  
  360.                                 addpaints();
  361.                                 pen = 1;
  362.                                 }
  363.                             ReplyMsg((struct Message *) msg);
  364.                             select(mode = 2);
  365.                             break;
  366.                         
  367.                         case 16:        /*    redplus        */
  368.                         case 17:        /*    greenplus    */
  369.                         case 18:        /*    blueplus    */
  370.                         case 19:        /*    redminus    */
  371.                         case 20:        /*    greenminus    */
  372.                         case 21:        /*    blueminus    */
  373.                             i =
  374.                                 (
  375.                                 ((struct Gadget *)msg->IAddress)->GadgetID
  376.                                 )
  377.                                 -16;
  378.  
  379.                             ReplyMsg((struct Message *) msg);
  380.                         
  381.                             if (mode == 2)
  382.                                 {
  383.                                 if (i > 2)
  384.                                     modcolours(pen, i-3, -1);
  385.                                 else
  386.                                     modcolours(pen, i, +1);
  387.                                 }
  388.                             
  389.                             break;
  390.                         
  391.                         case 22:
  392.                         case 23:
  393.                         case 24:
  394.                         case 25:
  395.                         case 26:
  396.                         case 27:            /*    choosing pen colour    */
  397.                             if (mode == 2)
  398.                                 pen =
  399.                                         (
  400.                                         ((struct Gadget *)msg->IAddress)
  401.                                         ->GadgetID
  402.                                         )
  403.                                         -21;
  404.  
  405.                             ReplyMsg((struct Message *) msg);
  406.  
  407.                             if (mode == 2)
  408.                                 selectpen(pen);
  409.  
  410.                             break;
  411.                             
  412.                         default:
  413.                             ReplyMsg((struct Message *) msg);
  414.                             break;
  415.                         }
  416.                     break;
  417.  
  418.                 case MOUSEBUTTONS:
  419.                     if (msg->Code == SELECTDOWN || msg->Code == MENUDOWN)
  420.                         {
  421.                         if (mode == 0)
  422.                             {
  423.                             if    ((i = whatsquare(msg->MouseX,msg->MouseY)) >=0)
  424.                                 {
  425.                                 /*    make i = layer to twist, j = direction */
  426.                             
  427.                                 j = msg->Code == SELECTDOWN ? 1: -1;
  428.                             
  429.                                 if ((i /= 9) == 1 || i == 2 || i == 4)
  430.                                     j = -j;
  431.                                 
  432.                                 showtwist ((short) i,(short) j);
  433.                                 waiting_output = 0;
  434.                                 }
  435.                             }
  436.                         else if (mode == 2)
  437.                             {
  438.                             if    ((i = paints(msg->MouseX,msg->MouseY,pen)) >=0)
  439.                                 {
  440.                                 (square[i]).colour = pen;
  441.                                 waiting_output = 0;
  442.                                 }
  443.                             }
  444.                         }
  445.                     ReplyMsg((struct Message *) msg);
  446.                     break;
  447.  
  448.                 default:
  449.                     ReplyMsg((struct Message *) msg);
  450.                      break;
  451.                 }
  452.             }
  453.         else
  454.             Delay (1);    /*    give other tasks a chance    */
  455.         }
  456.     }
  457.  
  458.